package com.casa_apoio.controller;

import com.casa_apoio.model.dao.CidadeDAO;
import com.casa_apoio.model.dao.CidadeUtilDAO;
import com.casa_apoio.model.entity.Cidade;
import com.casa_apoio.model.entity.CidadeUtil;
import com.casa_apoio.util.FacesContextUtil;
import java.io.Serializable;
import java.util.List;
import javax.faces.application.FacesMessage;
import javax.faces.bean.ManagedBean;
import javax.faces.bean.ViewScoped;
import javax.faces.context.FacesContext;
import javax.faces.event.ValueChangeEvent;

@ManagedBean
@ViewScoped
public class MbCidade implements Serializable {

    private Cidade cidade;
    private List<Cidade> cidades;
    private String pesquisa;
    private Integer codigo;
    private CidadeUtil cidadeUtil = new CidadeUtil();
    private List<CidadeUtil> cidadeUtils;
    private String estado;

    private CidadeDAO cidadeDAO() {
        CidadeDAO<Cidade> cidadeDAO = new CidadeDAO<Cidade>(Cidade.class, FacesContextUtil.getRequestSession());
        return cidadeDAO;
    }

    private CidadeUtilDAO<CidadeUtil> cidadeUtilDAO() {
        CidadeUtilDAO<CidadeUtil> cidadeUtilDAO = new CidadeUtilDAO<CidadeUtil>(CidadeUtil.class, FacesContextUtil.getRequestSession());
        return cidadeUtilDAO;
    }

    public void carregarCidade(ValueChangeEvent event) {
        System.out.println("carregarMunicipios  " + event.getNewValue().toString());
        cidadeUtils = cidadeUtilDAO().listaCidadesPorEstado(event.getNewValue().toString());
        FacesContext.getCurrentInstance().renderResponse();
    }

    public void pesquisarCidades() {
        if (!pesquisa.isEmpty()) {
            this.cidades = cidadeDAO().pesquisarCidades(pesquisa);
        } else {
            FacesContext.getCurrentInstance().addMessage(null, new FacesMessage(FacesMessage.SEVERITY_WARN, "Para realizar a pesquisa o campo não pode ser vazio!", "Erro"));
        }
    }

    public void carregarCidadeUtil(ValueChangeEvent event) {
        codigo = Integer.parseInt(event.getNewValue().toString());
        cidadeUtil = cidadeUtilDAO().getEntity(codigo);
        cidades = cidadeDAO().verificaCidadeAtiva(cidadeUtil.getCodigo());
       
        if (cidades.size() > 0) {
            cidade = cidades.get(0);
        } else {
            cidade = new Cidade();
            cidade.setCodigo(cidadeUtil.getCodigo());
            cidade.setCidade(cidadeUtil.getCidade());
            cidade.setUf(cidadeUtil.getUf());
        }

        FacesContext.getCurrentInstance().renderResponse();
    }

    public String salvarCidade() {
        if (cidade.getIdCidade() == null || cidade.getIdCidade() == 0) {
            cidadeDAO().salvar(cidade);
            FacesContext.getCurrentInstance().addMessage(null, new FacesMessage(FacesMessage.SEVERITY_INFO, "Gravação efetuada com sucesso!", "Informação"));
        } else {
            cidadeDAO().atualizar(cidade);
            FacesContext.getCurrentInstance().addMessage(null, new FacesMessage(FacesMessage.SEVERITY_INFO, "Alteração efetuada com sucesso!", "Erro"));
        }
        limparCidade();
        return "cadastroCidade.faces";
    }

    public String alterarCidade() {
        System.out.println("Id Cidade " + cidade.getIdCidade());
        //this.cidade = cidade;
        return "cadastroCidade.faces";
    }

    public void limparCidade() {
        cidade = new Cidade();
    }

    public String excluir(Cidade cidade) {
        cidadeDAO().excluir(cidade);
        return null;
    }

    public Cidade getCidade() {
        if (cidade == null) {
            cidade = new Cidade();
        }
        return cidade;
    }

    public void setCidade(Cidade cidade) {
        this.cidade = cidade;
    }

    public List<Cidade> getCidades() {
        if (cidades == null) {
            cidades = cidadeDAO().listarCidadeOrdenada();
        }
        return cidades;
    }

    public void setCidades(List<Cidade> cidades) {
        this.cidades = cidades;
    }

    public String getPesquisa() {
        return pesquisa;
    }

    public void setPesquisa(String pesquisa) {
        this.pesquisa = pesquisa;
    }

    public Integer getCodigo() {
        return codigo;
    }

    public void setCodigo(Integer codigo) {
        this.codigo = codigo;
    }

    public CidadeUtil getCidadeUtil() {
        return cidadeUtil;
    }

    public void setCidadeUtil(CidadeUtil cidadeUtil) {
        this.cidadeUtil = cidadeUtil;
    }

    public List<CidadeUtil> getCidadeUtils() {
        return cidadeUtils;
    }

    public void setCidadeUtils(List<CidadeUtil> cidadeUtils) {
        this.cidadeUtils = cidadeUtils;
    }

    public String getEstado() {
        return estado;
    }

    public void setEstado(String estado) {
        this.estado = estado;
    }

}
